package com.soushin.mvpdemo;

import android.app.Application;
import android.content.Context;
import android.support.multidex.MultiDex;

import com.blankj.ALog;
import com.hjq.toast.ToastUtils;
import com.zhouyou.http.EasyHttp;
import com.zhouyou.http.cache.converter.SerializableDiskConverter;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import com.soushin.mvpdemo.network.TokenInterceptor;
import com.soushin.mvpdemo.widget.ToastStyle;

/**
 * app初始化
 * @auther SouShin
 * @time 2018/12/27 10:08
 */
public class App extends Application {
    private static App INSTANCE;

    @Override
    public void onCreate() {
        super.onCreate();
        INSTANCE = this;
        ToastUtils.init(this,new ToastStyle());
        initApp();
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(base);
    }

    /**
     * 这些初始化操作在主线程会拖延App启动速度
     * 建议在子线程进行
     */
    private void initApp() {
        Observable.just(this)
                .subscribeOn(Schedulers.io())
                .observeOn(Schedulers.io())
                .subscribe(new Observer<App>() {
                    Disposable disposable;
                    @Override
                    public void onSubscribe(Disposable d) {
                        disposable=d;
                    }

                    @Override
                    public void onNext(App app) {
                        initALog();
                        initEasyHttp();
                        //注册生命周期回调
                        registerActivityLifecycleCallbacks(new ActivityLifeCycleCallBackIml());
                    }

                    @Override
                    public void onError(Throwable e) {
                        disposable.dispose();
                    }

                    @Override
                    public void onComplete() {
                        disposable.dispose();
                    }
                });
    }

    /**
     * 获取app示例
     *
     * @return
     */
    public static App getInstance() {
        return INSTANCE;
    }

    // init it in ur application
    public void initALog() {
        ALog.init(this)
                .setLogSwitch(BuildConfig.DEBUG)// 设置log总开关，包括输出到控制台和文件，默认开
                .setConsoleSwitch(BuildConfig.DEBUG)// 设置是否输出到控制台开关，默认开
                .setGlobalTag(null)// 设置log全局标签，默认为空
                // 当全局标签不为空时，我们输出的log全部为该tag，
                // 为空时，如果传入的tag为空那就显示类名，否则显示tag
                .setLogHeadSwitch(true)// 设置log头信息开关，默认为开
                .setLog2FileSwitch(false)// 打印log时是否存到文件的开关，默认关
                .setDir("")// 当自定义路径为空时，写入应用的/cache/log/目录中
                .setFilePrefix("")// 当文件前缀为空时，默认为"alog"，即写入文件为"alog-MM-dd.txt"
                .setBorderSwitch(false)// 输出日志是否带边框开关，默认开
                .setConsoleFilter(ALog.V)// log的控制台过滤器，和logcat过滤器同理，默认Verbose
                .setFileFilter(ALog.V)// log文件过滤器，和logcat过滤器同理，默认Verbose
                .setStackDeep(1);// log栈深度，默认为1

    }

    private void initEasyHttp() {
        EasyHttp.init(this);
//        全局设置请求头
//        HttpHeaders headers = new HttpHeaders();
//        全局设置请求参数
//        HttpParams params = new HttpParams();
        EasyHttp.getInstance()
                .debug("NetWork--INFO")
                .setReadTimeOut(20 * 1000)
                .setWriteTimeOut(20 * 1000)
                .setConnectTimeout(20 * 1000)
                .setRetryCount(3)//默认网络不好自动重试3次
                .setRetryDelay(500)//每次延时500ms重试
                .setRetryIncreaseDelay(500)//每次延时叠加500ms
                .setBaseUrl(Configure.BASE_URL)
                .setCacheDiskConverter(new SerializableDiskConverter())//默认缓存使用序列化转化
                .setCacheMaxSize(50 * 1024 * 1024)//设置缓存大小为50M
                .setCacheVersion(1)//缓存版本为1
                .addInterceptor(new TokenInterceptor())
//                .setHostnameVerifier(new UnSafeHostnameVerifier(Url))//全局访问规则
                .setCertificates();//信任所有证书
//                .addCommonHeaders(headers)//设置全局公共头
//                .addCommonParams(params)//设置全局公共参数
//                .addInterceptor(new CustomSignInterceptor());//添加参数签名拦截器
    }


}
